package ru.spb.nicetu.altx.mnemo.utils;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Listener;

public class TextUtils {
  /**
   * Навесить Слушателя на Компонент (FocusOut, Modify, KeyDown)
   */
  public static void startTextWidgetEventListener(Control control, Listener lst) {
    control.addListener(SWT.FocusOut, lst);
    control.addListener(SWT.Modify,   lst);
    control.addListener(SWT.KeyDown, lst);
  }
  /**
   * Снять Слушателя с Компонента (FocusOut, Modify, KeyDown)
   */
  public static void stopTextWidgetEventListener(Control control, Listener lst) {
    if ((control != null) && !control.isDisposed()) {
      control.removeListener(SWT.FocusOut, lst);
      control.removeListener(SWT.Modify,   lst);
      control.removeListener(SWT.KeyDown,  lst);
    }
  }

  /**
   * Парсит строчку в типу Boolean по правилу: "true"=>true, "false"=> false,
   * другое=>defaultValue
   */
  public static Boolean convertStringToBoolean(String strValue, Boolean defaultValue) {
    Boolean result = defaultValue;
    if (Boolean.TRUE.toString().equalsIgnoreCase(strValue))
      result = Boolean.TRUE;
    if (Boolean.FALSE.toString().equalsIgnoreCase(strValue))
      result = Boolean.FALSE;

    return result;
  }

  /**
   * Парсит строчку в типу Double, если не получается вернется defaultValue
   */
  public static Double convertStringToDouble(String strValue, Double defaultValue) {
    strValue = strValue.replace(".", ",");

    NumberFormat numberFormatter = NumberFormat.getInstance();
    Double value;
    try {
      value = forceDouble(numberFormatter.parse(strValue));
    } catch (ParseException e) {
      value = defaultValue;
    }
    return value;
  }

  /**
   * Конвертирует Double в строку, в формате обычной десятичной записи, 
   * в качестве разделителя может быть "," или "."
   * @param val
   * @return
   */
  public static String convertDoubleToString(Double val) {
    final String pattern = "#.#######################";
    NumberFormat f = new DecimalFormat(pattern);

    String result = f.format(val);
    result = result.replace(",", ".");

    return result;
  }

  /**
   * Конвертирует переданную строку в Integer и возвращает результат. Если конвертация невозможна, то возвращает defaultValue
   * @param strValue - исходная строка
   * @param defaultValue - значение по умолчанию
   * @return результат конвертации или defaultValue
   *
   * @throws NumberFormatException
   */
  public static Integer convertStringToInteger(String strValue, Integer defaultValue){
    Integer value;
    try{
      value = Integer.valueOf(strValue);
    } catch (NumberFormatException e) {
      value = defaultValue;
    }
    return value;
  }

  
  private static Double forceDouble(Number number) {
    if (!(number instanceof Double))
      return new Double(number.doubleValue());
    return (Double) number;
  }


} // class TextUtils
